(function(){
    // TODO: 不知道为什么代理形式怎么这么复杂，不懂原理
    
    // 数据代理proxy是进行数据读写的主要途径，通过数据代理操作数据进行CRUD
    // 每一步操作会得到唯一的Ext.data.Operation实例，包含了所有的请求参数
    // 包含Ext.data.proxy.Client客户端代理和Ext.data.proxy.Server服务端代理
   
    // Ext.data.proxy.Client 客户端代理
    // 包含Ext.data.proxy.Memory普通内存代理和Ext.data.proxy.WebStorage浏览器客户端存储代理
    
    // Ext.data.proxy.Memory 普通内存代理
    function testExtDataProxyMemory(){
        Ext.define("Person", {
            extend: "Ext.data.Model",
            fields: [
                {name: "name", type: "string"},
                {name: "age", type: "int"},
                {name: "email", type: "string"}
            ]
        });
        // 不用Ext.create，直接用proxy来实例化
        var personData = [
            {name: "p0", age: 0},
            {name: "p1", age: 1}
        ];
        // 创建代理类，相当于MVC中的controller
        var memoryProxy = Ext.create("Ext.data.proxy.Memory", {
            data: personData,
            model: 'Person'
        });
        // CRUD
        // TODO: 这样子update方法作什么用？
        personData.push({name: "p2", age: 2});
        memoryProxy.update(new Ext.data.Operation({
            action: "update",
            data: personData
        }), function(result){
            
        });
        memoryProxy.read(new Ext.data.Operation(), function(result){
            // records实际就是model数组
            var dataArray = result.resultSet.records;
            Ext.Array.each(dataArray, function(model){
                alert(model.get('name'));
            });
        });
    }
    
    // Ext.data.proxy.WebStorage 浏览器客户端存储代理，
    // 包含Ext.data.proxy.SessionStorage浏览器级别代理和Ext.data.proxy.LocalStorage本地化级别代理
    
    // Ext.data.proxy.LocalStorage 本地化级别代理，类似保存到浏览器的cookies，同浏览器可以保持，不同浏览器的cookies不一样
    function testExtDataProxyLocalStorage(){
        Ext.define("Person", {
            extend: "Ext.data.Model",
            fields: [
                {name: "name", type: "string"},
                {name: "age", type: "int"},
                {name: "email", type: "string"}
            ],
            // 省略model
            proxy: {
                type: "localstorage",
                id: "tt-searchs" // 全局唯一
            }
        });
        // 用store来初始化数据
        // TODO: store使用model的proxy？
        var store = Ext.create("Ext.data.Store", {
            model: "Person"
        });
        store.add(
            {name: "kkkk", age: 2}
        );
        // Synchronizes the Store with its Proxy
        store.sync();
        store.load();
        var msg = [];
        store.each(function(record){
            msg.push(record.get("name"));
        });
        alert(msg.join("\n"));
        // 开启关闭等多次刷新输出测试
    }
    
    // Ext.data.proxy.SessionStorage 浏览器级别代理
    function testExtDataProxySessionStorage(){
        Ext.define("Person", {
            extend: "Ext.data.Model",
            fields: [
                {name: "name", type: "string"},
                {name: "age", type: "int"},
                {name: "email", type: "string"}
            ],
            // 省略model
            proxy: {
                type: "sessionstorage",
                id: "tt-searchs" // 全局唯一
            }
        });
        // 用store来初始化数据
        var store = Ext.create("Ext.data.Store", {
            model: "Person"
        });
        store.add(
            {name: "kkkk", age: 2}
        );
        // Synchronizes the Store with its Proxy
        store.sync();
        store.load();
        var msg = [];
        store.each(function(record){
            msg.push(record.get("name"));
        });
        alert(msg.join("\n"));
        // 开启关闭等多次刷新输出测试
    }
    
    // Ext.data.proxy.Server 服务端代理
    // 包含Ext.data.proxy.Ajax、Ext.data.proxy.JsonP、Ext.data.proxy.Direct
    
    // Ext.data.proxy.Ajax 异步加载
    function testExtDataProxyAjax(){
        Ext.define("Person", {
            extend: "Ext.data.Model",
            fields: [
                {name: "name", type: "string"},
                {name: "age", type: "int"},
                {name: "email", type: "string"}
            ]
        });
        var ajaxProxy = Ext.create("Ext.data.proxy.Ajax", {
            url: webroot + '/lesson04/ajaxdataproxy',
            model: "Person",
            reader: "json",
            limitParam: "pageLimit" // 修改传送的limit参数名称，为pageLimit=10
        });
        // doRequest比read动作范围要大
        // 参数形式：start:1 limit:10 sort:[{"property":"name","direction":"ASC"}]
        ajaxProxy.doRequest(new Ext.data.Operation({
            action: "read",
            limit: 10,
            start: 1,
            sorters: [
                new Ext.util.Sorter({
                    property: "name",
                    direction: "ASC"
                })
            ]
        }), function(o){
            var text = o.response.responseText;
            alert(Ext.JSON.decode(text)['name']);
        });
    }
    
    // Ext.data.proxy.Rest rest方式
    
    // Ext.data.proxy.JsonP 跨域相互，要求两端服务器都要相应协议
    function testExtDataProxyJsonP(){
         Ext.define("Person", {
            extend: "Ext.data.Model",
            fields: [
                {name: "name", type: "string"},
                {name: "age", type: "int"},
                {name: "email", type: "string"}
            ],
            // 省略model
            proxy: {
                type: "jsonp",
                // 生成请求参数，callback=Ext.data.JsonP.callback1，目标端返回"Ext.data.JsonP.callback1({name:'kk'})"，接着原理是源端会将返回脚本写入本地js，然后执行传回的回调方法获得传回的数据
                url: "http://192.168.1.100:8080/extjs4/lesson04/ajaxdataproxy"
            }
        });
        var p = Ext.ModelManager.getModel("Person");
        p.load(2, {
            scope: this,
            success: function(model){
                alert(model.get("name"));
            }
        });
    }
    
    // Ext.data.proxy.Direct 命令
    
    var webroot;
    
    Ext.onReady(function(){
        webroot = Ext.get("webroot").getValue();
//        testExtDataProxyMemory();
//        testExtDataProxyLocalStorage();
//        testExtDataProxySessionStorage();
//        testExtDataProxyAjax();
//        testExtDataProxyJsonP();
    });
})();